package Network;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
 * 实现UDP 回显服务器
 * 服务端
 */

class UdpEchoServer{
    //创建DatagramSocket类，进行发送数据和接收数据
    private DatagramSocket socket=null;
    //UDP服务端 构造方法 serverPock: 指定端口号
    public UdpEchoServer(int serverPort) throws SocketException {
        socket=new DatagramSocket(serverPort);
    }
    //start方法中，完成Socket的 接收客户端请求，做出响应 返回响应的功能
    public void start() throws IOException {
        System.out.println("服务器启动");
        while(true){//每次循环 ，就是处理一个请求-响应的过程
            //1.创建一个DatagramPacket类空对象，用来接收用户的请求
            DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);
            //通过receive接收用户的请求,
            // receive方法参数属于输出型参数,将读取到的用户的请求存储到提前创建的DatagramPacket中
            // 此处可能会出现阻塞-》等待用户发送请求
            socket.receive(requestPacket);
            //2.根据请求 计算响应
            //先将请求转换成字符串 方便后面的操作
            String request=new String(requestPacket.getData(),0,requestPacket.getLength());
            //计算响应
            String response=process(request);
            //3.将响应返回给客户端
            //先将响应打包成DatagramPacket， 指定数据内容、长度、要发给哪个客户端
            DatagramPacket responsePacket=new DatagramPacket(response.getBytes(),
                    0,response.getBytes().length, requestPacket.getSocketAddress());
           //将响应返回给客户端
            socket.send(responsePacket);
            //打印用户IP 端口号，请求信息 响应信息
            System.out.printf("[%s,%d],req:%s，resp:%s\n",requestPacket.getAddress(),requestPacket.getPort(),
                                                            request,response);
        }
    }

    public String process(String request) {
        //这里什么也不做，就将用户的请求返回
        return request;
    }
    //测试
    public static void main(String[] args) throws IOException {
        UdpEchoServer udpEchoServer = new UdpEchoServer(9090);
        udpEchoServer.start();
    }
}


